#include<iostream>
#include<pthread.h>
#include<queue>
using namespace std;
#define N 5//默认容量；
// #define SIZE 5

template<class T>
class Queue
{
public:
    Queue(int max = N)
    :_max(max)
    {}
    void push(const T&date)
    {
        //生产数据；
        //进行加锁；
        pthread_mutex_lock(&_mutex);
        if(_q.size() == _max)
        {
            //进行等待；
            pthread_cond_wait(&_productor,&_mutex);
        }
        _q.push(date);//生产一个数据，必然可以进行消费；
        pthread_cond_signal(&_consumer);
        pthread_mutex_unlock(&_mutex);
    }
    T pop()
    {
        pthread_mutex_lock(&_mutex);
        if(_q.size() == 0)
        {
            pthread_cond_wait(&_consumer,&_mutex);
        }
        T date = _q.front();//消费了一个数据就可以进行生产了
        _q.pop();
        pthread_cond_signal(&_productor);
        pthread_mutex_unlock(&_mutex);
        return date;
    }
    void Init()
    {
        //初始化；
        pthread_mutex_init(&_mutex,nullptr);
        pthread_cond_init(&_productor,nullptr);
        pthread_cond_init(&_consumer,nullptr);

    }
    ~Queue()
    {
        pthread_mutex_destroy(&_mutex);
        pthread_cond_destroy(&_productor);
        pthread_cond_destroy(&_consumer);

    }
private:
    queue<T>_q;
    pthread_mutex_t _mutex;//确保互斥关系；
    pthread_cond_t _productor;//等待；
    pthread_cond_t _consumer;
    int _max;//确保容量；
};